home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / sparc / include / asm / smp_32.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  4.7 KB  |  179 lines

  1. /* smp.h: Sparc specific SMP stuff.
  2.  *
  3.  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
  4.  */
  5.  
  6. #ifndef _SPARC_SMP_H
  7. #define _SPARC_SMP_H
  8.  
  9. #include <linux/threads.h>
  10. #include <asm/head.h>
  11. #include <asm/btfixup.h>
  12.  
  13. #ifndef __ASSEMBLY__
  14.  
  15. #include <linux/cpumask.h>
  16.  
  17. #endif /* __ASSEMBLY__ */
  18.  
  19. #ifdef CONFIG_SMP
  20.  
  21. #ifndef __ASSEMBLY__
  22.  
  23. #include <asm/ptrace.h>
  24. #include <asm/asi.h>
  25. #include <asm/atomic.h>
  26.  
  27. /*
  28.  *    Private routines/data
  29.  */
  30.  
  31. extern unsigned char boot_cpu_id;
  32. extern cpumask_t phys_cpu_present_map;
  33. #define cpu_possible_map phys_cpu_present_map
  34.  
  35. typedef void (*smpfunc_t)(unsigned long, unsigned long, unsigned long,
  36.                unsigned long, unsigned long);
  37.  
  38. /*
  39.  *    General functions that each host system must provide.
  40.  */
  41.  
  42. void sun4m_init_smp(void);
  43. void sun4d_init_smp(void);
  44.  
  45. void smp_callin(void);
  46. void smp_boot_cpus(void);
  47. void smp_store_cpu_info(int);
  48.  
  49. struct seq_file;
  50. void smp_bogo(struct seq_file *);
  51. void smp_info(struct seq_file *);
  52.  
  53. BTFIXUPDEF_CALL(void, smp_cross_call, smpfunc_t, cpumask_t, unsigned long, unsigned long, unsigned long, unsigned long)
  54. BTFIXUPDEF_CALL(int, __hard_smp_processor_id, void)
  55. BTFIXUPDEF_BLACKBOX(hard_smp_processor_id)
  56. BTFIXUPDEF_BLACKBOX(load_current)
  57.  
  58. #define smp_cross_call(func,mask,arg1,arg2,arg3,arg4) BTFIXUP_CALL(smp_cross_call)(func,mask,arg1,arg2,arg3,arg4)
  59.  
  60. static inline void xc0(smpfunc_t func) { smp_cross_call(func, cpu_online_map, 0, 0, 0, 0); }
  61. static inline void xc1(smpfunc_t func, unsigned long arg1)
  62. { smp_cross_call(func, cpu_online_map, arg1, 0, 0, 0); }
  63. static inline void xc2(smpfunc_t func, unsigned long arg1, unsigned long arg2)
  64. { smp_cross_call(func, cpu_online_map, arg1, arg2, 0, 0); }
  65. static inline void xc3(smpfunc_t func, unsigned long arg1, unsigned long arg2,
  66.                unsigned long arg3)
  67. { smp_cross_call(func, cpu_online_map, arg1, arg2, arg3, 0); }
  68. static inline void xc4(smpfunc_t func, unsigned long arg1, unsigned long arg2,
  69.                unsigned long arg3, unsigned long arg4)
  70. { smp_cross_call(func, cpu_online_map, arg1, arg2, arg3, arg4); }
  71.  
  72. static inline int smp_call_function(void (*func)(void *info), void *info, int wait)
  73. {
  74.     xc1((smpfunc_t)func, (unsigned long)info);
  75.     return 0;
  76. }
  77.  
  78. static inline int smp_call_function_single(int cpuid, void (*func) (void *info),
  79.                        void *info, int wait)
  80. {
  81.     smp_cross_call((smpfunc_t)func, cpumask_of_cpu(cpuid),
  82.                (unsigned long) info, 0, 0, 0);
  83.     return 0;
  84. }
  85.  
  86. static inline int cpu_logical_map(int cpu)
  87. {
  88.     return cpu;
  89. }
  90.  
  91. static inline int hard_smp4m_processor_id(void)
  92. {
  93.     int cpuid;
  94.  
  95.     __asm__ __volatile__("rd %%tbr, %0\n\t"
  96.                  "srl %0, 12, %0\n\t"
  97.                  "and %0, 3, %0\n\t" :
  98.                  "=&r" (cpuid));
  99.     return cpuid;
  100. }
  101.  
  102. static inline int hard_smp4d_processor_id(void)
  103. {
  104.     int cpuid;
  105.  
  106.     __asm__ __volatile__("lda [%%g0] %1, %0\n\t" :
  107.                  "=&r" (cpuid) : "i" (ASI_M_VIKING_TMP1));
  108.     return cpuid;
  109. }
  110.  
  111. #ifndef MODULE
  112. static inline int hard_smp_processor_id(void)
  113. {
  114.     int cpuid;
  115.  
  116.     /* Black box - sun4m
  117.         __asm__ __volatile__("rd %%tbr, %0\n\t"
  118.                      "srl %0, 12, %0\n\t"
  119.                      "and %0, 3, %0\n\t" :
  120.                      "=&r" (cpuid));
  121.                  - sun4d
  122.         __asm__ __volatile__("lda [%g0] ASI_M_VIKING_TMP1, %0\n\t"
  123.                      "nop; nop" :
  124.                      "=&r" (cpuid));
  125.        See btfixup.h and btfixupprep.c to understand how a blackbox works.
  126.      */
  127.     __asm__ __volatile__("sethi %%hi(___b_hard_smp_processor_id), %0\n\t"
  128.                  "sethi %%hi(boot_cpu_id), %0\n\t"
  129.                  "ldub [%0 + %%lo(boot_cpu_id)], %0\n\t" :
  130.                  "=&r" (cpuid));
  131.     return cpuid;
  132. }
  133. #else
  134. static inline int hard_smp_processor_id(void)
  135. {
  136.     int cpuid;
  137.  
  138.     __asm__ __volatile__("mov %%o7, %%g1\n\t"
  139.                  "call ___f___hard_smp_processor_id\n\t"
  140.                  " nop\n\t"
  141.                  "mov %%g2, %0\n\t" : "=r"(cpuid) : : "g1", "g2");
  142.     return cpuid;
  143. }
  144. #endif
  145.  
  146. #define raw_smp_processor_id()        (current_thread_info()->cpu)
  147.  
  148. #define prof_multiplier(__cpu)        cpu_data(__cpu).multiplier
  149. #define prof_counter(__cpu)        cpu_data(__cpu).counter
  150.  
  151. void smp_setup_cpu_possible_map(void);
  152.  
  153. #endif /* !(__ASSEMBLY__) */
  154.  
  155. /* Sparc specific messages. */
  156. #define MSG_CROSS_CALL         0x0005       /* run func on cpus */
  157.  
  158. /* Empirical PROM processor mailbox constants.  If the per-cpu mailbox
  159.  * contains something other than one of these then the ipi is from
  160.  * Linux's active_kernel_processor.  This facility exists so that
  161.  * the boot monitor can capture all the other cpus when one catches
  162.  * a watchdog reset or the user enters the monitor using L1-A keys.
  163.  */
  164. #define MBOX_STOPCPU          0xFB
  165. #define MBOX_IDLECPU          0xFC
  166. #define MBOX_IDLECPU2         0xFD
  167. #define MBOX_STOPCPU2         0xFE
  168.  
  169. #else /* SMP */
  170.  
  171. #define hard_smp_processor_id()        0
  172. #define smp_setup_cpu_possible_map() do { } while (0)
  173.  
  174. #endif /* !(SMP) */
  175.  
  176. #define NO_PROC_ID            0xFF
  177.  
  178. #endif /* !(_SPARC_SMP_H) */
  179.